上周在单位无聊,公司电脑又不能上网,想研究一些swing相关的东西,结果swing没怎么研究,到是写了一个比较坑爹的游戏。
游戏开始之后,出现此框,鼠标点击到此框即算过关,框框是一直在乱跳的,跳的频率随着关口的靠后会加快。
设计思路:
程序加载时new一个frame,不允许frame最大化,但是鼠标滚动可以改变框框的大小(这算一后门),frame中添加一个button,在button中添加两个事件,一个是监听鼠标滚动事件,一个是监听点击事件。
点击事件发生后会改变框框跳动的频率。当累计超过10次被框框逃脱即算失败。
框框跳动的动作在一个单独的线程中进行。
所用技术:
- swing
- 多线程,线程池,线程终止
下面是完整代码:
1 | import javax.swing.*; |
通过ide的导出功能可以打成一个可执行的jar包,双击一下即可运行,我老婆玩了一下,说这倒霉游戏太坑爹了。
关于线程终止可以多说几句鄙人的浅显认识,java线程的终止是非抢占的,这是官方说法,大概是这么说的吧,意思是什么呢,先不管怎么能让一个线程终止,就说你让一个线程终止的时候,线程不会立刻终止,你需要在你的代码中特定的检查点检查“终止状态”,如果状态是“已经终止”线程中的代码就进行相应的处理。
关于“终止状态”,可以设置一个变量,比如一个布尔型的flag,默认是true,当需要终止线程的时候把这个变量编程false,那么在线程执行的代码中,比较“重要的点”,检查一下这个状态,如果编程了false就不要往下继续进行了,并可以做一些操作去响应这个终止的信号。
关于“重要的点”,这个要根据程序中的逻辑来判断,不可能没句话都检查一下,比如多线程中要做一个打开链接的操作,可能在打开后设置一个检查的点,如果flag变成了false,就不要往下继续进行了,并且要把链接关掉(比如jdbc链接)。(反过来想,如果java线程终止是抢占式的,那岂不是不给咱们机会去关链接了)。
有一种特殊情况,阻塞的代码,正在运行的代码可以通过判断状态来处理,如果是阻塞的代码,程序已经卡在那里,无法判断状态,怎么办呢(比如我上面代码中的TimeUnit.MILLISECONDS.sleep(3000/level) 这一行,程序在睡眠的时候如果想要终止程序,不可能一定要等到阻塞的代码恢复后继续走到检查点在去做判断,那样响应时间无法保证),java提供了几种方式终止线程,比如我代码中用的调用Future.cancel(true),这样代码中的阻塞语句如果发现有人调用了取消方法,就会抛出InterruptedException异常,我这里是不需要针对取消操作做什么处理的,如果是需要处理,在catch到异常后可以做善后处理。
还有,我这个程序中的“终止状态”的判断用的是Thread.currentThread().isInterrupted()。